package com.portal.common.thread.example.part3;

/**
 * 线程安全：都是由全局变量及静态变量引起的
 * 1、若对全局变量及静态变量只有读操作没有写操作，则线程安全；若有写操作，则线程不安全。
 */

class Ticket2 implements Runnable{
    private int ticketNums = 100;
    Object lock = new Object(); // 锁对象

    @Override
    public void run() {
        while (true){
            // 同步代码快
            /**
             * synchronized(临界资源对象){ // 对其进行枷锁
             *  // 原子操作
             * }
             */
//            synchronized (lock ){
//            synchronized (this){
                synchronized (Ticket2.class){// .class 文件加载到内存时，只会创建一个Class 对象
                    if (ticketNums > 0){
                        try {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        System.out.println(Thread.currentThread().getName() + "正在卖第" + "张票"+ ticketNums--);
                    }
                }
            }
    }
}
public class ThreadSafe2 {
    public static void main(String[] args) {
        Ticket2 ticket2 = new Ticket2();
        Thread window1 = new Thread(ticket2, "窗口1");
        Thread window2 = new Thread(ticket2, "窗口2");
        Thread window3 = new Thread(ticket2, "窗口3");
        window1.start();
        window2.start();
        window3.start();
    }
}
